/*
 * @(#) BasSqlDaoImpl.java  1.0  2004-3-15
 *
 * Copyright 2003 by LongTop Corporation.
 * 2669 XieTu Road, ShangHai, PRC 200030
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of
 * LongTop Corporation ("Confidential Information").  You
 * shall not disclose such Confidential Information and shall use
 * it only in accordance with the terms of the license agreement
 * you entered into with LongTop.
 */

package com.cnc.bas.dao;

import java.util.List;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;


/**
 * @author hongdj
 * @version 1.0  2008-4-10
 */
public class BasSqlDaoImpl extends SqlMapClientDaoSupport implements IBasSqlDao {
	

    /**
     * 查询符合条件的记录，并从指定位置开始返回指定数目的结果集(可用于分页查询)。<br>
     * <p/>
     * <b>特别说明：由于该命令采用的分页技术不是数据库本身的分页技术，而是采用ResultSet的absolute定位技术，<br>
     * 需要把查询结果全部装入ResultSet再定位。如果查询结果较大（1万条记录以上)，效率会很低。<br>
     * 建议使用Hibernate的query方法或在SQL Map的XML中使用数据库内部分页技术<br>
     * （即把offset,size作为参数传入SQL语句的类似limit n,m中）来查询。
     * </b>
     * <p/>
     * 返回记录集和总的记录数
     *
     * @param statementId 调用iBatis的SqlMap文件的声明段名，规则名：SqlMap的namespace+"." + 该sqlMap文件某片段的id
     * @param value       查询条件值
     * @param offset      返回查询结果的起始行，从0开始
     * @param size        返回查询结果的最大行数
     * @return list       找到的记录
     */
    public Object[] queryPageForListBySql(String statementId, Object value, int offset, int size) {
        long l1 = System.currentTimeMillis();
        List total = this.getSqlMapClientTemplate().queryForList(statementId, value);
        List list = this.getSqlMapClientTemplate().queryForList(statementId, value, offset, size);
        long l2 = System.currentTimeMillis();
        logger.debug("Execute queryPageForListBySql time:" + (l2 - l1) + "ms");
        //数据库含有空格的字段值(char类型)，装载到iBatis生成的持久对象属性中,是否自动去掉属性值左右两边的空格
        //如果需要去掉空格，则使用如下方式
        //list = Config.getPropertyBool("po.propertyvalue.trimable", true) ? BeanUtil.trim(list) : list
        return new Object[]{list,total.size()};
    }

    /**
     * 查询符合条件的记录，生成Object返回。
     * <p/>
     * 示例如下：<br>
     * <pre>
     * 一、定义sqlMap文件
     * <p/>
     * &lt;sqlMap namespace="user"&gt;
     * &nbsp;&nbsp;&lt;resultMap id="AccountResult" class="Account" groupBy="id"&gt;
     * &nbsp;&nbsp;&nbsp;&nbsp;&lt;result property="id" column="ID"/&gt;
     * &nbsp;&nbsp;&nbsp;&nbsp;&lt;result property="firstName" column="FIRST_NAME"/&gt;
     * &nbsp;&nbsp;&nbsp;&nbsp;&lt;result property="lastName" column="LAST_NAME"/&gt;
     * &nbsp;&nbsp;&nbsp;&nbsp;&lt;result property="emailAddress" column="EMAIL"/&gt;
     * &nbsp;&nbsp;&nbsp;&nbsp;&lt;result property="role" resultMap="Account.roleResult"/&gt;
     * &nbsp;&nbsp;&lt;/resultMap&gt;
     * &nbsp;&nbsp;&lt;select id="selectAccountById" parameterClass="int" resultMap="AccountResult"&gt;
     * &nbsp;&nbsp;&nbsp;&nbsp;select B.ROLEID, B.ROLENAME, A.ID, A.FIRST_NAME,A.LAST_NAME,A.EMAIL from ACCOUNT A
     * &nbsp;&nbsp;&nbsp;&nbsp;left outer join ROLE B on A.ROLEID = B.ROLEID where A.ID = #id#
     * &nbsp;&nbsp;&lt;/select&gt;
     * &lt;/sqlMap&gt;
     * <p/>
     * 二、调用方法处理
     * <p/>
     * Account account = (Account)this.queryForObjectBySql("user.selectAccountById",new Integer(10));
     * </pre>
     *
     * @param statementId 调用iBatis的SqlMap文件的声明段名，规则名：SqlMap的namespace+"." + 该sqlMap文件某片段的id
     * @param value       查询条件值
     * @return list 找到的记录
     */
    public Object queryForObjectBySql(String statementId, Object value) {
        long l1 = System.currentTimeMillis();
        Object bean = this.getSqlMapClientTemplate().queryForList(statementId, value);
        long l2 = System.currentTimeMillis();
        logger.debug("Execute queryForObjectBySql time:" + (l2 - l1) + "ms");
        //数据库含有空格的字段值(char类型)，装载到iBatis生成的持久对象属性中,是否自动去掉属性值左右两边的空格
        //如果需要去掉空格，则使用如下方式
        //bean = Config.getPropertyBool("po.propertyvalue.trimable", true) ? BeanUtil.trim(bean) : bean
        return bean;
    }



}
